perm filename DDCALL.SAI[DD,BGB] blob sn#001295 filedate 1972-03-04 generic text, type T, neo UTF8
COMMENT ⊗   VALID 00017 PAGES 
RECORD PAGE   DESCRIPTION
 00001 00001
 00003 00002	ENTRY	ERASTV,ERASDD,DPYDD,
 00006 00003	α ERASE THE VIDEO SYNTHESIZER'S  TV SCREEN
 00008 00004	α THE LOGICAL TO PHYSICAL MAPPING IS DERIVED FROM:
 00010 00005	α CONVERT SOURCE AND OBJECT XY WINDOWS INTO CLIPED RC WINDOWS
 00013 00006	α THE DATA DISC CLIPPER
 00015 00007	α SIDE CROSSINGS
 00017 00008	α DOUBLE CROSSER
 00018 00009	INTERNAL PROCEDURE AI (SHORT REAL X,Y)
 00020 00010	α ARC displays an arc of radius R centered about the most recent AI(X,Y)
 00022 00011	α RADIAL displays the line segment which radiates from the pseudo
 00024 00012	α CHANNEL MAP
 00026 00013	α DISPLAY A STRING ON CHANNEL 36 AT CURRENT BEAM POSITION
 00027 00014	PROCEDURE DDLOAD
 00028 00015	α MAIL ARGUMENTS
 00029 00016	INTERNAL PROCEDURE DPYDD(STRING FileINTEGER ARRAY Swindo,Owindo,Levels)
 00030 00017	INTERNAL PROCEDURE SHOWDD (INTEGER XXX)
 00031 ENDMK
⊗;
ENTRY	ERASTV,ERASDD,DPYDD,
	SETWND,SETLWN,SETDWN,
	AI,AV,DOT,ARC,RADIAL,DMS,
	DDSTRC,DDSTR,
	SHOWDD,DRUMDD,TVSEG;

BEGIN	"DDCALL"
	REQUIRE "ABBREV[SYS,BGB]" SOURCE_FILE;
	REQUIRE "SAITRG[SYS,BGB]" SOURCE_FILE;
	INTEGER ARRAY JOBBUF[1:1000];
	INTEGER ARCPTR;

α THE LETTER;	SAFE SHORT INTEGER ARRAY LETTER[0:31];
DEFINE
	MYJOB	=	"LETTER[0]",
	FILENAME="LETTER[1]",EXTENSION="LETTER[2]",PPNAME="LETTER[3]",	
	LEVWRD	=	"LETTER[4]",
	JADDR	=	"LETTER[5]",
	LEVCHN	=	"LETTER[6]",
	SX="LETTER[7]",SY="LETTER[8]",SDX="LETTER[9]",SDY="LETTER[10]",
	OX="LETTER[11]",OY="LETTER[12]",MAGPOW="LETTER[13]",
	FRAME#	=	"LETTER[14]",
	SEGNAME	=	"LETTER[15]",
	ILX="LETTER[16]",ILY="LETTER[17]",ILDX="LETTER[18]",ILDY="LETTER[19]",
	DR="LETTER[20]",DC="LETTER[21]",DM="LETTER[22]",DN="LETTER[23]",
	VCNT	=	"LETTER[24]",
	ACNT	=	"LETTER[25]",
	COMMAND	=	"LETTER[31]";
α COMMAND 1 DPYDD;
α COMMAND 2 SHOWDD;
α COMMAND 3 DRUMDD;
α COMMAND 4 TVSEG;

α PHYSICAL WINDOW FRAMES;
	DEFINE TVM="216", TVN="288";
	DEFINE DDR="0",   DDC="0";
	DEFINE DDM="480", DDN="512";
	DEFINE DDR2="479",DDC2="511";

α RC SOURCE WINDOW;
	SHORT INTEGER SR,SC,SM,SN;
α DESTINATION WINDOW;
	SHORT INTEGER DR2,DC2;
	INTEGER MAGNIF;
α LOGICAL WINDOW;
	REAL LX,LY,LDX,LDY;
FORWARD INTERNAL PROCEDURE SHOWDD (INTEGER X);
α ERASE THE VIDEO SYNTHESIZER'S  TV SCREEN;
	PRELOAD_WITH
	'136004361324,	'136004361324,	0,
	'136004351324,	'136004351324,	0,
	'136004341324,	'136004341324,	0,
	'136004331324,	'136004331324,	0,
	'136004321324,	'136004321324,	0,
	'136004371324,	'136004371324,	0;
	INTEGER ARRAY EDDBUF[1:18];

INTERNAL PROCEDURE ERASTV;
QUICK_CODE "ERASTV"
	INTEGER T1,T2;
	LABEL L;
	MOVE	11,EDDBUF;
	MOVEM	11,T1;
	MOVEI	11,3;
	MOVEM	11,T2;
	MOVEI	12,6;
L:	'715000000000 3,T1;
	ADDM	11,T1;
	SOJG	12,L;
END	"ERASTV";

α ERASE THE DATA DISC'S SCREEN;
INTERNAL PROCEDURE ERASDD ;
BEGIN	"ERASDD"
	INTEGER T1,T2,U1,U2,U3;
	U1←U2←'136004001324;
	U3←0;
START_CODE
	MOVEI	11,U1;
	MOVEM	11,T1;
	MOVEI	11,3;
	MOVEM	11,T2;
	'715000000000 3,T1;
END;
END	"ERASDD";
α THE LOGICAL TO PHYSICAL MAPPING IS DERIVED FROM:
	column	←	DC + DN/2  +  (X-SX)*KX
	row   	←	DR + DM/2  -  (Y-SY)*KY;
	SHORT REAL BEAMX,BEAMY,KX,KY,KROW,KCOL;
INTERNAL PROCEDURE SETWND (SHORT REAL ARRAY LWN; SHORT INTEGER ARRAY DWN);
BEGIN	"SETWND"
α DESTINATION WINDOW;
	DR	←	DWN[1];
	DC	←	DWN[2];
	DM	←	DWN[3];
	DN	←	DWN[4];
	DR2	←	DR + DM - 1;
	DC2	←	DC + DN - 1;
α SOURCE WINDOW;
	LX	←	LWN[1];
	LY	←	LWN[2];
	LDX	←	LWN[3];
	LDY	←	LWN[4];
α COMPUTE SOURCE TO DESTINATION MAPPING CONSTANTS;
	KX	←	(DN-1)/(2*LDX);
	KY	←	(DM-1)/(2*LDY);
	KCOL	←	DC - KX*(LX-LDX);
	KROW	←	DR + KY*(LY+LDY);
END	"SETWND";

INTERNAL PROCEDURE SETLWN (SHORT REAL A,B,C,D);
BEGIN	"SETLWN"
α SOURCE WINDOW;
	LX ← A; LY ← B; LDX ← C; LDY ← D;
α COMPUTE SOURCE TO DESTINATION MAPPING CONSTANTS;
	KX	←	(DN-1)/(2*LDX);
	KY	←	(DM-1)/(2*LDY);
	KCOL	←	DC - KX*(LX-LDX);
	KROW	←	DR + KY*(LY+LDY);
END	"SETLWN";

INTERNAL PROCEDURE SETDWN (INTEGER A,B,C,D);
BEGIN	"SETDWN"
α DESTINATION WINDOW;
	DR ← A; DC ← B; DM ← C; DN ← D;
	DR2	←	DR + DM - 1;
	DC2	←	DC + DN - 1;
α COMPUTE SOURCE TO DESTINATION MAPPING CONSTANTS;
	KX	←	(DN-1)/(2*LDX);
	KY	←	(DM-1)/(2*LDY);
	KCOL	←	DC - KX*(LX-LDX);
	KROW	←	DR + KY*(LY+LDY);
END	"SETDWN";
α CONVERT SOURCE AND OBJECT XY WINDOWS INTO CLIPED RC WINDOWS;
INTERNAL PROCEDURE WNCLIP ;
BEGIN	"WNCLIP"
	INTEGER RL,RH,CL,CH;
	INTEGER SXL,SXH,SYL,SYH;
α MAGNIFICATION FROM MAG POWER;
	MAGNIF	←	(1 LSH MAGPOW);
α CONVERT OBJECT XY TO RC DESTINATION CENTRAL;
	DR	←	(DDM%2-1) - OY;
	DC	←	OX + DDN%2;
α CLIP THE SOURCE WINDOW TO FIT THE DESTINATION FRAME;
	SXL←SX -(IF (DC-SDX*MAGNIF)<DDC  THEN (DC-DDC )%MAGNIF ELSE SDX);
	SXH←SX +(IF (DC+SDX*MAGNIF)>DDC2 THEN (DDC2-DC)%MAGNIF ELSE SDX-1);
	SYH←SY +(IF (DR-SDY*MAGNIF)<DDR  THEN (DR-DDR )%MAGNIF ELSE SDY-1);
	SYL←SY -(IF (DR+SDY*MAGNIF)>DDR2 THEN (DDR2-DR)%MAGNIF ELSE SDY);
α CONVERT THE SOURCE WINDOW FROM XY TO RC;
	RL	←	(TVM%2-1) - SYH;
	RH	←	(TVM%2-1) - SYL;
	CL	←	SXL + TVN%2;
	CH	←	SXH + TVN%2;
α CLIP THE RC SOURCE WINDOW TO FIT THE SOURCE FRAME;
	RL	←	RL MAX 0;
	CL	←	CL MAX 0;
	RH	←	RH MIN (TVM-1);
	CH	←	CH MIN (TVN-1);
α INIT THE RC SOURCE WINDOW;
	SR	←	RL;
	SC	←	CL;
	SM	←	RH - RL +1;
	SN	←	CH - CL +1;
α RE-INIT THE XY SOURCE WINDOW WHICH IS ALSO THE LOGICAL WINDOW;
	SDX	←	SN/2;
	SDY	←	SM/2;
α PHYSICAL DESTINATION WINDOW;
	DC	←	DDC MAX (DC-SDX*MAGNIF);
	DR	←	DDR MAX (DR-SDY*MAGNIF);
	DR2	←	DDR2 MIN (DR + 2*SDY*MAGNIF-1);
	DC2	←	DDC2 MIN (DC + 2*SDX*MAGNIF-1);
	DM	←	DR2 - DR + 1;
	DN	←	DC2 - DC + 1;
	SETLWN(SX,SY,SDX,SDY);
END	"WNCLIP";
α THE DATA DISC CLIPPER;
	INTEGER C1,R1,C2,R2;		α THE LINE SEGMENT;
	BOOLEAN PROCEDURE CLIP;
BEGIN	"DDCLIP"
	INTEGER QNE,QNW,QSW,QSE;
	REAL A,B,C,ADC,ADC2,BDR,BDR2;
	INTEGER IN1,IN2;
	LABEL NOSHOW;
α EASY INSIDERS;
	IN1	←	DC≤C1 ∧ C1≤DC2 ∧ DR≤R1 ∧ R1≤DR2;
	IN2	←	DC≤C2 ∧ C2≤DC2 ∧ DR≤R2 ∧ R2≤DR2;
	IF IN1 ∧ IN2 THEN RETURN(TRUE);
α LINE COEFFICIENTS, INTERIOR TO THE LEFT IS POSITIVE;
	A	←	R1 - R2;
	B	←	C2 - C1;
	C	←	C1*R2 - C2*R1;
α PARTIAL PRODUCTS;
	ADC	←	A*DC;
	ADC2	←	A*DC2;
	BDR	←	B*DR;
	BDR2	←	B*DR2;
α CORNER Q'S;
	QNE	←	ADC2 + BDR2 + C;
	QNW	←	ADC + BDR2 + C;
	QSW	←	ADC + BDR + C;
	QSE	←	ADC2 + BDR + C;
α EASY OUTSIDERS;
	IF C1>DC2 ∧ C2>DC2  ∨
	   C1<DC ∧ C2<DC  ∨
	   R1<DR ∧ R2<DR  ∨
	   R1>DR2 ∧ R2>DR2  THEN GO NOSHOW;
α SIDE CROSSINGS;
	DEFINE	N? = "QNE⊗QNW<0";
	DEFINE	S? = "QSE⊗QSW<0";
	DEFINE	E? = "QNE⊗QSE<0";
	DEFINE	W? = "QNW⊗QSW<0";

	DEFINE EAST1 = "BEGIN C1 ← DC2; R1 ← -(ADC2 + C)/B END";
	DEFINE WEST1 = "BEGIN C1 ← DC; R1 ← -(ADC + C)/B END";
	DEFINE NORTH1 = "BEGIN C1 ← -(BDR2 + C)/A; R1 ← DR2 END";
	DEFINE SOUTH1 = "BEGIN C1 ← -(BDR + C)/A; R1 ← DR END";

	DEFINE EAST2 = "BEGIN C2 ← DC2; R2 ← -(ADC2 + C)/B END";
	DEFINE WEST2 = "BEGIN C2 ← DC; R2 ← -(ADC + C)/B END";
	DEFINE NORTH2 = "BEGIN C2 ← -(BDR2 + C)/A; R2 ← DR2 END";
	DEFINE SOUTH2 = "BEGIN C2 ← -(BDR + C)/A; R2 ← DR END";
α SINGLE CROSSER END1 WITHIN;
IF IN1		THEN
BEGIN
	IF E?		THEN
	IF C2>DC2	THEN	EAST2	ELSE
	IF N?		THEN	NORTH2	ELSE
	IF S?		THEN	SOUTH2	ELSE	WEST2	ELSE
	IF N?		THEN
	IF R2>DR2	THEN	NORTH2	ELSE
	IF S?		THEN	SOUTH2	ELSE	WEST2	ELSE
	IF DC>C2	THEN	WEST2	ELSE	SOUTH2;
	RETURN(TRUE);
END	ELSE
α SINGLE CROSSER END2 WITHIN;
IF IN2		THEN
BEGIN
	IF E?		THEN
	IF C1>DC2	THEN	EAST1	ELSE
	IF N?		THEN	NORTH1	ELSE
	IF S?		THEN	SOUTH1	ELSE	WEST1	ELSE
	IF N?		THEN
	IF R1>DR2	THEN	NORTH1	ELSE
	IF S?		THEN	SOUTH1	ELSE	WEST1	ELSE
	IF DC>C1	THEN	WEST1	ELSE	SOUTH1;
	RETURN(TRUE);
END	ELSE
α DOUBLE CROSSER;
IF E?		THEN
BEGIN
	EAST1;
	IF N?	THEN	NORTH2	ELSE
	IF S?	THEN	SOUTH2	ELSE	WEST2;
END		ELSE
IF N?		THEN
BEGIN
	NORTH1;
	IF S?	THEN	SOUTH2	ELSE	WEST2;
END	ELSE
	IF W?	THEN	
BEGIN
	WEST1;
	SOUTH2;
END 	ELSE	GO NOSHOW;
	RETURN(3);
NOSHOW:	RETURN(FALSE);
END	"DDCLIP";
INTERNAL PROCEDURE AI (SHORT REAL X,Y);
BEGIN	"AI"
	BEAMX	←	X;
	BEAMY	←	Y;
END	"AI";

INTERNAL PROCEDURE AV (SHORT REAL X,Y);
BEGIN	"AV"
	R1	←	KROW - KY*BEAMY;
	C1	←	KCOL + KX*BEAMX;
	BEAMX←X;	BEAMY←Y;
	R2	←	KROW - KY*Y;
	C2	←	KCOL + KX*X;
	IF CLIP THEN
	START_CODE
		HRLZ	0,	R1;
		HRR	0,	R2;
		ROT	0,	9;
		HRLZ	1,	C1;
		HRR	1,	C2;
		IOR	1,	0;
		AOS	2,	VCNT;
		ADD	2,	JOBBUF;
		MOVEM	1,	-1(2);
	END;
	IF (ACNT*6+VCNT)≥992 THEN SHOWDD(LEVCHN);
END	"AV";

INTERNAL PROCEDURE DOT (SHORT REAL X,Y);
BEGIN	"DOT"
	SHORT INTEGER RR,CC,BIPTR,BIT0;
	RR ← KROW - KY*Y;
	CC ← KCOL + KX*X;
α AVOID OVERFLOW;
	IF RR = ((DR MAX RR) MIN DR2) ∧ CC = ((DC MAX CC) MIN DC2) THEN
	START_CODE
		HRLZ	0,	RR;
		HRR	0,	RR;
		ROT	0,	9;
		HRLZ	1,	CC;
		HRR	1,	CC;
		IOR	1,	0;
		AOS	2,	VCNT;
		ADD	2,	JOBBUF;
		MOVEM	1,	-1(2);
	END;
	IF (ACNT*6+VCNT)≥992 THEN SHOWDD(LEVCHN);
END	"DOT";
α ARC displays an arc of radius R centered about the most recent AI(X,Y);
α L is the arc's directed length from a starting point A radians from
  the positive X axis,  L & A are in radians and CCW is positive;

INTERNAL PROCEDURE ARC (REAL R,L,A);
BEGIN	"ARC"
	REAL X,Y,S,C,XX;
	INTEGER I,N,CNT;
	R	←	ABS(R);
	IF SQRT((BEAMX-LX)↑2 + (BEAMY-LY)↑2) > (R + SQRT(LDX↑2+LDY↑2)) THEN RETURN;
	X	←	R*COS(A);
	Y	←	R*SIN(A);
	N	←	ABS(R*L*KX);
α	IF N≤5 THEN RETURN;
	L	←	L/N;
	CNT←ACNT←	ACNT+1;
	START_CODE
		MOVN	1,	CNT;
		IMULI	1,	6;
		ADD	1,	JOBBUF;
		SUBI	1,	1;
		MOVE X;		MOVEM 1001(1);		
		MOVE Y;		MOVEM 1002(1);		
		MOVE L;		MOVEM 1003(1);		
		MOVE N;		MOVEM 1004(1);		
		MOVE BEAMX;	MOVEM 1005(1);
		MOVE BEAMY;	MOVEM 1006(1);
	END;
	IF (ACNT*6+VCNT)≥992 THEN SHOWDD(LEVCHN);
END	"ARC";
α RADIAL displays the line segment which radiates from the pseudo
  beam position in the direction B, and lies between the ranges
  R1 and R2, the pseudo beam remains fixed unless R1=R2;

INTERNAL PROCEDURE RADIAL (REAL R1,R2,B);
BEGIN	"RADIAL"
	REAL BX,BY,X1,Y1,X2,Y2,C,S;
	C	←	COS(B);
	S	←	SIN(B);
	R1	←	ABS(R1);
	R2	←	ABS(R2);
	BX←BEAMX;BY←BEAMY;
	AI(R1*C+BX,R1*S+BY);
	IF R1=R2 THEN RETURN;
	AV(R2*C+BX,R2*S+BY);
	BEAMX←BX;BEAMY←BY;
END	"RADIAL";


α DMS converts from degrees, minutes and seconds to radians;
α The argument is in decimal positions DDDMMSS ← ((d*100+m)*100+s;

INTERNAL REAL PROCEDURE DMS (INTEGER X);
BEGIN	"DMS"
	INTEGER D,M,S,Y;
	REAL Z;
	Y	←	ABS(X);
	S	←	Y MOD 100;
	Y	←	Y DIV 100;
	M	←	Y MOD 100;
	D	←	Y DIV 100;
	Z	←	D*1745.32925@-5 + M*2908.8821@-7 + S*4848.1368@-9;
	IF X<0 THEN Z←-Z;
	RETURN(Z);
END	"DMS";
α CHANNEL MAP;
	PRELOAD_WITH 0,'36,'35,'34,'33,'32,'37,'30;
	INTEGER ARRAY DDCHAN[0:16];
INTERNAL PROCEDURE DDSTRC (INTEGER ROW,COL,CHN; STRING STR);
BEGIN	"DDSTRC"
	INTEGER SIZ,I;
	SIZ	←	LENGTH(STR);
	IF SIZ=0 THEN RETURN;
	SIZ	←	(IF SIZ MOD 5 THEN 1 ELSE 0) + SIZ%5;
BEGIN	"DDBLK"
	INTEGER ARRAY DDBUF[-1:SIZ+2+10];
	INTEGER FNLINE,COLCHN;
α ASSEMBLE THE FUNCTION AND LINE SELECT WORD;
	FNLINE	←	'1454;
	DPB('66,   POINT(6,FNLINE, 7));
	DPB(ROW%16,  POINT(5,FNLINE,15));
	DPB(ROW,     POINT(4,FNLINE,23));
	DDBUF[-1]←	FNLINE;
α ASSEMBLE THE COLUMN AND CHANNEL SELECT WORD;
	COLCHN	←	'3324;
	DPB(1,     POINT(8,COLCHN, 7));
	DPB((COL%6), POINT(8,COLCHN,15));
	DPB(DDCHAN[CHN],   POINT(8,COLCHN,23));
	DDBUF[0]←	COLCHN;
α PACK THE STRING INTO TEXT COMMAND WORDS;
	FOR I←1 STEP 1 UNTIL SIZ-1 DO
BEGIN	"PACK"
	DDBUF[I]←	CVASC(STR) LOR 1;
	STR	←	STR[6 TO ∞];
END	"PACK";
	DDBUF[SIZ]←	CVASC(STR) LOR 1;
	DDBUF[SIZ+1]←	'000004010034;
	DDBUF[SIZ+2]←	0;
α DISPLAY DD BUFFER;
START_CODE
	INTEGER T1,T2;
	MOVE	11,SIZ;
	ADDI	11,4;
	MOVEM	11,T2;
	MOVE	11,DDBUF;
	HRRZM	11,T1;
	'715000000000 3,T1;
	HRRZ	11,@DDBUF;
	TRC	11,'010000;
	HRRM	11,@DDBUF;
	'715000000000 3,T1;
END;
END	"DDBLK";
END	"DDSTRC";
α DISPLAY A STRING ON CHANNEL 36 AT CURRENT BEAM POSITION;
INTERNAL PROCEDURE DDSTR (REAL BEAMX,BEAMY;INTEGER CHN;STRING STR);
BEGIN	"DDSTR"
	INTEGER ROW,COL;
	ROW	←	KROW - KY*BEAMY;
	COL	←	KCOL + KX*BEAMX;
	DDSTRC(ROW,COL,CHN,STR);
END	"DDSTR";

INTERNAL PROCEDURE DDTYPE (INTEGER Y,G,L);
START_CODE	"DDTYPE"
	LABEL Q1,Q2;
	DEFINE	PPIOT="'702000000000";
	MOVE Y;HRRM Q1;
Q1:	PPIOT	2,	;
	MOVE		G;
	ANDI		7;
	LSH		9;
	IOR		L;
	HRRM		Q2;
Q2:	PPIOT	3,;
END	"DDTYPE";
PROCEDURE DDLOAD;
BEGIN	"DDLOAD"
	STRING STR; INTEGER LINE;
	LINE	←	PTYGET;
	PTOSTR(LINE,"L"&↓);
	STR←PTYSTR(LINE,"L");
	STR←PTYSTR(LINE,"#");
	PTOSTR(LINE,"DD/BGB"&↓);
	STR←PTYSTR(LINE,"B");
	STR←PTYSTR(LINE,"B");
	STR←PTYSTR(LINE,".");
	PTOSTR(LINE,"RU DDJOB"&↓);
	STR←PTYSTR(LINE,"B");
	CALL(0,"SLEEP");
	CALL(0,"SLEEP");
	STR←PTYSTR(LINE,"*");
	OUTSTR(↓&9&"Running DDJOB thru PTY."&↓);
END	"DDLOAD";
α MAIL ARGUMENTS;
	INTEGER DDJOB,LTRPTR;
	DEFINE MAIL="'710000000000";
PROCEDURE DDCALL;
START_CODE	"DDCALL"
	LABEL L1,L2;
α	SKIPE	1,MYJOB;
α	JRST	L1;
α MAIL INITIALIZATION;
	'047040000030;			α PJOB 1, UUO;
	MOVEM	1,MYJOB;
	MOVE	['444452574200];	α [SIXBIT/DDJOB/];
	MOVEM	DDJOB;
	'047000400043;			α NAMEIN UUO;
	PUSHJ	'17,DDLOAD;
	MOVE 	LETTER;			α LETTER POINTER;
	MOVEM	LTRPTR;
	HRRM	L2;
α SEND A LETTER;
L1:	MOVE	1,	LETTER;
	MOVE	LX;	MOVEM	16(1);
	MOVE	LY;	MOVEM	17(1);
	MOVE	LDX;	MOVEM	18(1);
	MOVE	LDY;	MOVEM	19(1);
	MAIL		DDJOB;
	JRST 4,;
α WAIT FOR THE RESULTS LETTER;
L2:	MAIL	1,;
END	"DDCALL";
INTERNAL PROCEDURE DPYDD(STRING File;INTEGER ARRAY Swindo,Owindo,Levels);
BEGIN	"DPYDD"
	INTEGER I;
	COMMAND←1;
α PACK UP LEVELS WORD;
	LEVWRD←0;
	FOR I←1 STEP 1 UNTIL 6 DO
	LEVWRD	← ((LEVWRD ROT 6) LOR (LEVELS[I] LAND '77));
α PUT SWINDO AND OWINDO IN THE LETTER;
	SX ← SWINDO[1];
	SY ← SWINDO[2];
	SDX← SWINDO[3];
	SDY← SWINDO[3];
	OX ← OWINDO[1];
	OY ← OWINDO[2];
	MAGPOW← OWINDO[3];
	WNCLIP;
α PARSE AND PACK THE FILE STRING;
	IF LENGTH(FILE)=0 THEN FILENAME←0 ELSE
	FILENAME←CVSIX(FILE);
	IF (LEVWRD =0) THEN ELSE DDCALL;
	FRAME#←0;
END	"DPYDD";
INTERNAL PROCEDURE SHOWDD (INTEGER XXX);
BEGIN	"SHOWDD"
	COMMAND←2;
	LEVCHN	←	XXX;
	IF (ACNT+VCNT)=0 THEN RETURN;
	START_CODE MOVE JOBBUF; MOVEM JADDR;END;
	DDCALL;
	FRAME#←0;
	ARCPTR←VCNT←ACNT←0;
	LEVWRD←0;
END	"SHOWDD";

INTERNAL PROCEDURE DRUMDD (INTEGER FRAME);
BEGIN	"DRUMDD"
	COMMAND←3;
	FRAME#←FRAME;
	IF FRAME≥0 THEN DDCALL;
END	"DRUMDD";

INTERNAL PROCEDURE TVSEG (STRING FILE,SEG);
BEGIN	"TVSEG"
	COMMAND←4;
	FILENAME←(IF LENGTH(FILE)=0 THEN 0 ELSE CVSIX(FILE));
	SEGNAME ←(IF LENGTH(SEG )=0 THEN 0 ELSE CVSIX(SEG ));
	IF FILENAME ∨ SEGNAME THEN DDCALL;
END	"TVSEG";

END	"DDCALL";